#include "widget.h"
#include "ui_widget.h"
#include <fstream>
#include <QDebug>
#include <QShortcut>

/*
 * TEST
 * 1. QTextEdit 不同于 QLineEdit，它表示多行输入框，也是一个 Markdown 编辑器
 * 2. QPlainTextEdit 也是输入框，但是只能是纯文本
 * 3. QTextCursor 表示编辑框中被选中的文字对象
 * 4. QComboBox 下拉框, 可以通过 addItems, 也可以通过 UI 页面来设置选项
 *              并且里面的选项可能是通过网络的方式来加载的
 * 5. QSpinBox 微调框，可以搭配 QComboBox 进行搭配使用
 * 6. QDateEdit/QTimeEdit/QDateTimeEdit 针对日期或时间来进行调整
 * 7. QDial 旋钮, wapping 表示存在更小粒度
 * 8. QSlider 滑动条, 通过滑动条调整窗口大小，并实现快捷键
 *    同时为当前组件去设置快捷键调整滑动条
*/

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->food->addItems({"香辣鸡腿堡", "双层牛肉堡", "鲜虾芝士堡"});
    ui->drink->addItems({"可乐", "雪碧", "橙汁"});
    ui->snack->addItems({"薯条", "薯饼", "鸡腿"});

    // 设置微调框的范围
    ui->spin->setRange(1, 10);

    // 给当前组件设置一个快捷键
    QShortcut* hshortcut_sub = new QShortcut(this);
    hshortcut_sub->setKey(QKeySequence("-"));
    QShortcut* hshortcut_plus = new QShortcut(this);
    hshortcut_plus->setKey(QKeySequence("="));
    // hshortcut_sub 是发送信号的对象, QShortcut::actived 表示该快捷键触发的信号
    // this 是对象，由 Widget 下的 sub_slipe_value 函数来处理这里的信号
    connect(hshortcut_sub, &QShortcut::activated, this, &Widget::sub_slipe_value);
    connect(hshortcut_plus, &QShortcut::activated, this, &Widget::plus_slipe_value);


    // 设置水平滑动条的最小值和最大值
    ui->horizontal->setMinimum(100);
    ui->horizontal->setMaximum(2000);
    // 设置默认值
    ui->horizontal->setValue(1800);
    // 每调整一次，100 为单位
    ui->horizontal->setSingleStep(100);

    ui->vertical->setMinimum(100);
    ui->vertical->setMaximum(1500);
    ui->vertical->setValue(1400);
    ui->vertical->setSingleStep(100);

    // 通过网络/文件的方式来填充 items
    // A) 先读取到 ifs 里面
    std::ifstream ifs("D:/MyCppCode/qt/untitled2/config.txt");
    if (ifs.is_open() == false) {
        qDebug() << "Open Fail: " << strerror(errno);
    }

    QStringList ls;
    while (ifs) {
        std::string line;
        std::getline(ifs, line);		// 从流中进行读取
        if (line.size() > 0)
            ls.push_back(QString(line.c_str()));
    }
    ui->net->addItems(ls);

    ifs.close();
}

// 文本被修改的时候发送的信号
void Widget::on_edit_textChanged()
{
    auto s = ui->edit->toPlainText();
    qDebug() << s << endl;
}

// 当编辑框里面的文本被选中时
void Widget::on_edit_selectionChanged()
{
    QTextCursor cursor = ui->edit->textCursor();
    qDebug() << cursor.selectedText();
}

// 当光标的位置发生改变的时候, 打印出当前光标的位置信息
void Widget::on_edit_cursorPositionChanged()
{
    QTextCursor cursor = ui->edit->textCursor();
    qDebug() << cursor.position();
}

void Widget::on_pushButton_clicked()
{
    qDebug() << "Food: " << ui->food->currentText();
    qDebug() << "Drink: " << ui->drink->currentText();
    qDebug() << "Snack: " << ui->snack->currentText();
    qDebug() << "BoyFriend: " << ui->net->currentText() << " Number: " << ui->spin->value();

    QDateTime start = ui->start->dateTime();
    QDateTime end   = ui->end->dateTime();
    qDebug() << "Days Diff: " << (start.secsTo(end) / 3600) / 24 << " And Secs Diff: " << (start.secsTo(end) / 3600) % 24 << " Hours";
}

void Widget::on_edit_undoAvailable(bool )
{
    qDebug() << "undoAvailable";
}

void Widget::on_edit_redoAvailable(bool )
{
    qDebug() << "redoAvailable";
}

void Widget::on_edit_copyAvailable(bool )
{
    qDebug() << "copyAvailable";
}

Widget::~Widget()
{
    delete ui;
}

void Widget::plus_slipe_value()
{
    int v = ui->horizontal->value();
    ui->horizontal->setValue(v + 50);
}

void Widget::sub_slipe_value()
{
    int v = ui->horizontal->value();
    ui->horizontal->setValue(v - 50);
}


// 当垂直滑动条的值变了之后
void Widget::on_vertical_valueChanged(int value)
{
    ui->vdisplay->setText("Value: " + QString::number(value));
    const QRect& rect = this->geometry();
    this->setGeometry(rect.x(), rect.y(), rect.width(), value);
}

void Widget::on_horizontal_valueChanged(int value)
{
    ui->hdisplay->setText("Value: " + QString::number(value));
    const QRect& rect = this->geometry();
    this->setGeometry(rect.x(), rect.y(), value, rect.height());
}
